/**
 * Mock 数据生成器 - Node.js 兼容版本
 */

// 简单的随机数据生成工具
const Random = {
  // 生成随机整数
  integer(min = 0, max = 100) {
    return Math.floor(Math.random() * (max - min + 1)) + min
  },

  // 生成随机布尔值
  boolean() {
    return Math.random() > 0.5
  },

  // 从数组中随机选择
  pick(arr) {
    return arr[Math.floor(Math.random() * arr.length)]
  },

  // 生成随机中文标题
  ctitle(min = 5, max = 20) {
    const words = [
      'Vue3',
      'React',
      'TypeScript',
      '前端开发',
      '后端架构',
      '数据库设计',
      '性能优化',
      '用户体验',
      '移动端',
      '微服务',
      '云计算',
      '人工智能',
      '机器学习',
      '区块链',
      '物联网',
      '大数据',
      '网络安全',
      '开源项目',
      '技术分享',
      '编程实践',
    ]
    const length = this.integer(min, max)
    let title = ''
    for (let i = 0; i < Math.min(length, 3); i++) {
      title += this.pick(words)
      if (i < Math.min(length, 3) - 1) title += '与'
    }
    return title + '实践指南'
  },

  // 生成随机中文段落
  cparagraph(min = 3, max = 10) {
    const sentences = [
      '在现代前端开发中，组件化架构已经成为主流趋势。',
      '通过合理的状态管理，我们可以构建更加稳定的应用程序。',
      '性能优化是每个开发者都需要关注的重要话题。',
      '用户体验设计直接影响产品的成功与否。',
      '持续集成和持续部署能够显著提高开发效率。',
      '代码质量管理是团队协作的基础保障。',
      '技术选型需要综合考虑项目需求和团队能力。',
      '开源社区为技术发展提供了强大的推动力。',
      '学习新技术需要理论与实践相结合。',
      '团队沟通协作是项目成功的关键因素。',
    ]
    const length = this.integer(min, max)
    let paragraph = ''
    for (let i = 0; i < length; i++) {
      paragraph += this.pick(sentences)
    }
    return paragraph
  },

  // 生成随机中文姓名
  cname() {
    const surnames = [
      '张',
      '李',
      '王',
      '刘',
      '陈',
      '杨',
      '赵',
      '黄',
      '周',
      '吴',
      '徐',
      '孙',
      '胡',
      '朱',
      '高',
      '林',
      '何',
      '郭',
      '马',
      '罗',
    ]
    const names = [
      '伟',
      '芳',
      '娜',
      '秀英',
      '敏',
      '静',
      '丽',
      '强',
      '磊',
      '军',
      '洋',
      '勇',
      '艳',
      '杰',
      '娟',
      '涛',
      '明',
      '超',
      '秀兰',
      '霞',
    ]
    return this.pick(surnames) + this.pick(names)
  },

  // 生成随机日期时间
  datetime(format = 'yyyy-MM-dd HH:mm:ss') {
    const now = new Date()
    const past = new Date(now.getTime() - Math.random() * 365 * 24 * 60 * 60 * 1000)
    return past.toISOString()
  },

  // 生成随机颜色
  color() {
    const colors = [
      '#3b82f6',
      '#10b981',
      '#f59e0b',
      '#ef4444',
      '#8b5cf6',
      '#06b6d4',
      '#84cc16',
      '#f97316',
      '#ec4899',
      '#6366f1',
    ]
    return this.pick(colors)
  },

  // 生成随机单词
  word(min = 3, max = 10) {
    const words = [
      'tech',
      'life',
      'thoughts',
      'tutorial',
      'share',
      'tools',
      'resources',
      'guide',
      'tips',
      'news',
    ]
    return this.pick(words)
  },
}

/**
 * 生成文章数据
 */
function generateArticles(count = 30) {
  const articles = []
  const categories = [
    { name: '技术', slug: 'tech' },
    { name: '生活', slug: 'life' },
    { name: '随想', slug: 'thoughts' },
    { name: '教程', slug: 'tutorial' },
    { name: '分享', slug: 'share' },
    { name: '工具', slug: 'tools' },
    { name: '资源', slug: 'resources' },
  ]

  const tagNames = [
    'Vue3',
    'TypeScript',
    'JavaScript',
    'CSS',
    'HTML',
    'Node.js',
    'React',
    '前端',
    '后端',
    '全栈',
    '设计',
    'UI',
    'UX',
    '性能优化',
    '工程化',
    '微前端',
    '移动端',
    '小程序',
    'PWA',
    'WebAssembly',
  ]

  for (let i = 1; i <= count; i++) {
    const category = Random.pick(categories)
    const tagCount = Random.integer(2, 5)
    const selectedTags = []

    // 随机选择标签
    for (let j = 0; j < tagCount; j++) {
      const tagName = Random.pick(tagNames)
      if (!selectedTags.find((t) => t.name === tagName)) {
        selectedTags.push({
          id: (j + 1).toString(),
          name: tagName,
          slug: tagName
            .toLowerCase()
            .replace(/[^a-z0-9]/g, '-')
            .replace(/-+/g, '-')
            .replace(/^-|-$/g, ''),
          color: Random.color(),
          articleCount: Random.integer(1, 30),
        })
      }
    }

    // 生成富文本内容 - Markdown格式
    const markdownSections = [
      '## 引言\n\n' + Random.cparagraph(5, 10),
      '\n\n## 主要内容\n\n' + Random.cparagraph(20, 50),
      '\n\n### 技术要点\n\n' + Random.cparagraph(8, 15),
      '\n\n#### 核心概念\n\n' + Random.cparagraph(4, 8),
      '\n\n#### 最佳实践\n\n' + Random.cparagraph(4, 8),
      '\n\n### 实践经验\n\n' + Random.cparagraph(6, 12),
      '\n\n#### 常见问题\n\n' + Random.cparagraph(3, 6),
      '\n\n#### 解决方案\n\n' + Random.cparagraph(3, 6),
      '\n\n## 代码示例\n\n```javascript\n// 示例代码\nconst example = {\n  name: "示例",\n  value: 42\n};\n\nconsole.log(example);\n```\n\n' +
        Random.cparagraph(2, 4),
      '\n\n## 总结\n\n' + Random.cparagraph(3, 8),
    ]

    // 生成对应的HTML内容（简化版，用于目录生成）
    const htmlSections = [
      '<h2>引言</h2>\n<p>' + Random.cparagraph(5, 10) + '</p>',
      '\n<h2>主要内容</h2>\n<p>' + Random.cparagraph(20, 50) + '</p>',
      '\n<h3>技术要点</h3>\n<p>' + Random.cparagraph(8, 15) + '</p>',
      '\n<h4>核心概念</h4>\n<p>' + Random.cparagraph(4, 8) + '</p>',
      '\n<h4>最佳实践</h4>\n<p>' + Random.cparagraph(4, 8) + '</p>',
      '\n<h3>实践经验</h3>\n<p>' + Random.cparagraph(6, 12) + '</p>',
      '\n<h4>常见问题</h4>\n<p>' + Random.cparagraph(3, 6) + '</p>',
      '\n<h4>解决方案</h4>\n<p>' + Random.cparagraph(3, 6) + '</p>',
      '\n<h2>代码示例</h2>\n<pre><code class="language-javascript">// 示例代码\nconst example = {\n  name: "示例",\n  value: 42\n};\n\nconsole.log(example);</code></pre>\n<p>' +
        Random.cparagraph(2, 4) +
        '</p>',
      '\n<h2>总结</h2>\n<p>' + Random.cparagraph(3, 8) + '</p>',
    ]

    const article = {
      id: i.toString(),
      title: Random.ctitle(10, 30),
      content: markdownSections.join(''), // Markdown 原始内容
      htmlContent: htmlSections.join(''), // HTML 渲染内容
      excerpt: Random.cparagraph(3, 5),
      slug: 'article-' + Random.word(5, 10).toLowerCase() + '-' + i,
      author: {
        id: Random.integer(1, 10).toString(),
        name: Random.cname(),
        avatar: `https://api.dicebear.com/7.x/avataaars/svg?seed=${Random.word(5, 10)}`,
      },
      publishDate: Random.datetime(),
      createdAt: Random.datetime(),
      updatedAt: Random.datetime(),
      category: {
        id: Random.integer(1, categories.length).toString(),
        name: category.name,
        slug: category.slug,
        description: Random.cparagraph(1, 2),
        color: Random.color(),
        articleCount: Random.integer(1, 50),
        createdAt: Random.datetime(),
        updatedAt: Random.datetime(),
      },
      tags: selectedTags.map((tag) => ({
        ...tag,
        createdAt: Random.datetime(),
        updatedAt: Random.datetime(),
      })),
      featured: Random.boolean(),
      status: Random.pick(['published', 'draft', 'archived']),
      readTime: Random.integer(5, 30),
      viewCount: Random.integer(100, 10000),
      likeCount: Random.integer(10, 500),
      commentCount: Random.integer(0, 50),
      coverImage: `https://picsum.photos/800/400?random=${Random.integer(1, 1000)}`,
      seo: {
        title: Random.ctitle(10, 30),
        description: Random.cparagraph(1, 2),
        keywords: selectedTags.map((tag) => tag.name),
      },
    }

    articles.push(article)
  }

  return articles
}

/**
 * 生成分类数据
 */
function generateCategories() {
  const categoryData = [
    { name: '技术', slug: 'tech' },
    { name: '生活', slug: 'life' },
    { name: '随想', slug: 'thoughts' },
    { name: '教程', slug: 'tutorial' },
    { name: '分享', slug: 'share' },
    { name: '工具', slug: 'tools' },
    { name: '资源', slug: 'resources' },
  ]

  return categoryData.map((cat, index) => ({
    id: (index + 1).toString(),
    name: cat.name,
    slug: cat.slug,
    description: Random.cparagraph(1, 2),
    color: Random.color(),
    articleCount: Random.integer(1, 50),
  }))
}

/**
 * 生成标签数据
 */
function generateTags() {
  const tagNames = [
    'Vue3',
    'TypeScript',
    'JavaScript',
    'CSS',
    'HTML',
    'Node.js',
    'React',
    '前端',
    '后端',
    '全栈',
    '设计',
    'UI',
    'UX',
    '性能优化',
    '工程化',
    '微前端',
    '移动端',
    '小程序',
    'PWA',
    'WebAssembly',
    'Docker',
    'Kubernetes',
    '微服务',
    '数据库',
    'Redis',
    'MongoDB',
  ]
  const count = Random.integer(15, 25)
  const tags = []

  for (let i = 0; i < count; i++) {
    const name = Random.pick(tagNames)
    if (!tags.find((t) => t.name === name)) {
      tags.push({
        id: (i + 1).toString(),
        name,
        slug: name
          .toLowerCase()
          .replace(/[^a-z0-9]/g, '-')
          .replace(/-+/g, '-')
          .replace(/^-|-$/g, ''),
        color: Random.color(),
        articleCount: Random.integer(1, 30),
      })
    }
  }

  return tags
}

/**
 * 生成用户数据
 */
function generateUsers() {
  const count = Random.integer(5, 10)
  const users = []

  for (let i = 1; i <= count; i++) {
    users.push({
      id: i.toString(),
      name: Random.cname(),
      username: Random.word(5, 10) + i,
      email: `user${i}@example.com`,
      avatar: `https://api.dicebear.com/7.x/avataaars/svg?seed=user${i}`,
      role: Random.pick(['admin', 'editor', 'author']),
      createDate: Random.datetime(),
      lastLoginDate: Random.datetime(),
    })
  }

  return users
}

/**
 * 生成评论数据
 */
function generateComments(articleIds) {
  const comments = []
  const userIds = users.map((u) => u.id)

  // 预定义的评论内容
  const commentContents = [
    '这篇文章写得很好，学到了很多东西！感谢分享。',
    '同意楼上的观点，确实很有启发性。',
    '有个地方不太理解，能详细解释一下吗？',
    '我来回答一下，这个问题其实是这样的...',
    '这个技术栈我之前也用过，确实很不错。',
    '感谢作者的分享，让我对这个问题有了新的认识。',
    '代码示例很清晰，很容易理解。',
    '这个解决方案很实用，我已经在项目中使用了。',
    '请问有没有相关的文档链接？',
    '这个性能优化方案很有效，我们团队也在用。',
    '作者提到的这个点很重要，我之前忽略了。',
    '这个框架的学习曲线怎么样？',
    '有没有遇到过兼容性问题？',
    '这个设计模式很经典，值得深入学习。',
    '感谢分享，收藏了！',
    '这个工具确实能提高开发效率。',
    '请问这个方案适用于什么场景？',
    '这个思路很新颖，值得尝试。',
    '有没有更多的实践案例？',
    '这个技术选型很合理，支持！',
    '学到了，谢谢分享！',
    '这个问题的解决方案很全面。',
    '请问作者还有其他相关的文章吗？',
    '这个性能测试结果很有说服力。',
    '这个架构设计很清晰，容易理解。',
    '感谢作者的耐心解答。',
    '这个最佳实践很实用。',
    '请问这个方案的成本如何？',
    '这个技术趋势值得关注。',
    '这个实现方式很优雅。',
  ]

  const replyContents = [
    '同意你的观点！',
    '我也遇到过类似的问题。',
    '感谢补充，很有帮助。',
    '这个思路不错。',
    '确实如此。',
    '学到了，谢谢！',
    '我也这么认为。',
    '补充一点，还可以考虑...',
    '这个建议很实用。',
    '感谢分享经验。',
    '我也遇到过这个问题。',
    '这个解决方案可行。',
    '同意楼上的看法。',
    '补充一下我的理解...',
    '这个角度很新颖。',
    '感谢指正。',
    '我也在关注这个技术。',
    '这个实践很有价值。',
    '学到了新知识。',
    '这个建议值得尝试。',
  ]

  // 为每个文章生成评论
  articleIds.forEach((articleId, articleIndex) => {
    // 每篇文章生成 100 条评论
    const commentCount = 100

    for (let i = 0; i < commentCount; i++) {
      const authorId = Random.pick(userIds)
      const author = users.find((u) => u.id === authorId)
      const commentIndex = (articleIndex * commentCount + i) % commentContents.length

      comments.push({
        id: `${articleId}_${i + 1}`,
        articleId: articleId,
        content: commentContents[commentIndex],
        parentId: null,
        author: {
          id: author.id,
          name: author.name || author.username,
          avatar: author.avatar,
          username: author.username,
        },
        mentionedUsers: [],
        likes: Random.integer(0, 50),
        isLiked: Random.boolean(),
        likedUsers: [],
        status: 'approved',
        createdAt: new Date(Date.now() - Random.integer(0, 30) * 24 * 60 * 60 * 1000).toISOString(),
        updatedAt: new Date(Date.now() - Random.integer(0, 30) * 24 * 60 * 60 * 1000).toISOString(),
      })
    }
  })

  // 为每篇文章生成100条回复
  articleIds.forEach((articleId, articleIndex) => {
    const articleComments = comments.filter((c) => c.articleId === articleId && !c.parentId)

    // 为每篇文章生成100条回复
    for (let i = 0; i < 100; i++) {
      const parentComment = Random.pick(articleComments)
      const authorId = Random.pick(userIds)
      const author = users.find((u) => u.id === authorId)
      const replyIndex = i % replyContents.length

      comments.push({
        id: `${parentComment.id}_reply_${i + 1}`,
        articleId: parentComment.articleId,
        content: replyContents[replyIndex],
        parentId: parentComment.id,
        author: {
          id: author.id,
          name: author.name || author.username,
          avatar: author.avatar,
          username: author.username,
        },
        mentionedUsers: [],
        likes: Random.integer(0, 20),
        isLiked: Random.boolean(),
        likedUsers: [],
        status: 'approved',
        createdAt: new Date(Date.now() - Random.integer(0, 15) * 24 * 60 * 60 * 1000).toISOString(),
        updatedAt: new Date(Date.now() - Random.integer(0, 15) * 24 * 60 * 60 * 1000).toISOString(),
      })
    }
  })

  return comments
}

// 生成所有数据
const users = generateUsers()
const articles = generateArticles(30)
const categories = generateCategories()
const tags = generateTags()
const comments = generateComments(articles.map((a) => a.id))

// 数据后处理
articles.forEach((article) => {
  // 确保发布状态的文章有合理的数据
  if (article.status === 'published') {
    article.featured = Random.boolean()
  } else {
    article.featured = false
    article.viewCount = 0
  }
})

// 去重分类和标签（基于 slug）
const uniqueCategories = categories.filter(
  (cat, index, self) => index === self.findIndex((c) => c.slug === cat.slug),
)

const uniqueTags = tags.filter(
  (tag, index, self) => index === self.findIndex((t) => t.slug === tag.slug),
)

export { articles, uniqueCategories as categories, uniqueTags as tags, users, comments }

// 重新生成数据的方法
export function regenerate() {
  const newArticles = generateArticles(30)
  const newCategories = generateCategories()
  const newTags = generateTags()

  return {
    articles: newArticles,
    categories: newCategories,
    tags: newTags,
  }
}
